/*----------------------------------------------------------------------------*\
|
|						Public Interface to Muse Technology
|
|							     www.Muse.com
| Author : SunJun 
| Email : sundoom@msn.com
\*----------------------------------------------------------------------------*/

//////////////////////////////////////////////////////////////////////////
// $Id: Effect.h,v 1.2 2009/04/03 12:51:25 sunjun Exp $
//////////////////////////////////////////////////////////////////////////

#ifndef __Effect__
#define __Effect__

//////////////////////////////////////////////////////////////////////////

#if defined __cplusplus

//////////////////////////////////////////////////////////////////////////

#include <Context.h>

//////////////////////////////////////////////////////////////////////////

NAMESPACE_BEGIN

//////////////////////////////////////////////////////////////////////////

	// this class provides an object-oriented effect interface.
	class API Effect : public MReference
	{		
	public:
		// constructor
		Effect( const Context* rc );
		
		// destructor
		virtual ~Effect();

		// get the handle
		INLINE HANDLE handle() const;

		// load the data
		INLINE VOID load( const VOID* data, U32 size, const CHAR** macros = NULL );

		// get the parameter
		INLINE HANDLE getParameter( const CHAR* name ) const;

		// get the technique
		INLINE HANDLE getTechnique( const CHAR* name ) const;

		// get the pass
		INLINE HANDLE getPass( HANDLE technique, const CHAR* name ) const;

		// set parameters
		INLINE VOID setValue( HANDLE handle, const VOID* data, U32 size );
		INLINE VOID setBool( HANDLE handle, BOOL b );
		INLINE VOID setBoolArray( HANDLE handle, const BOOL* pb, U32 count );
		INLINE VOID setInt( HANDLE handle, I32 n );
		INLINE VOID setIntArray( HANDLE handle, const I32* pn, U32 count );		
		INLINE VOID setFloat( HANDLE handle, F32 f );		
		INLINE VOID setFloatArray( HANDLE handle, const F32* pf, U32 count );		
		INLINE VOID setVector( HANDLE handle, const Vector4& vec );		
		INLINE VOID setVectorArray( HANDLE handle, const Vector4* pvec, U32 count );		
		INLINE VOID setMatrix( HANDLE handle, const Matrix& mat );		
		INLINE VOID setMatrixArray( HANDLE handle, const Matrix* pmat, U32 count );		
		INLINE VOID setString( HANDLE handle, const CHAR* string );		
		INLINE VOID setTexture( HANDLE handle, const Texture* texture );

		// using the technique
		INLINE U32 begin( HANDLE technique = NULL );		
		INLINE VOID beginPass( U32 pass );
		INLINE VOID endPass();
		INLINE VOID end();

	private:
		ContextPtr mRCPtr;
		HANDLE mHandle;

	private: friend class Primitive;
	};	

	typedef MPtr<Effect>EffectPtr;

//////////////////////////////////////////////////////////////////////////

NAMESPACE_END

//////////////////////////////////////////////////////////////////////////

#endif // __cplusplus

//////////////////////////////////////////////////////////////////////////

#endif // __Effect__

//////////////////////////////////////////////////////////////////////////